/**
 * @Module ID:   <(模块)类编号，可以引用系统设计中的类编号>
 * @Comments: <对此类的描述，可以引用系统设计中的描述>
 * @JDK version used:      <JDK1.8> 08
 * @author zhoulj(周利军) [1217102780@qq.com]
 * @since 2019/5/22-15:08
 */
package com.zykj.synchronizevolatile;

//共享变量：一个变量在多个线程的工作内存都存在副本 ， 那就可以说这个变量为共享变量
//可见性：  一个线程对《共享变量》 修改后能够及时被其他线程看到


//JMM   java内存模型
/**
    规定：
    1：现在对共享变量的修改都只能在本线程的工作内存中完成， 不能去修改主内存中的变量
    2：不能对其他线程的工作内存 读写（只能通过主内存进行交互）

    可见性实现方式：（sychronize && volatile）
    可见性规定：
        退出 sychronized 代码块钱 刷新修改后的共享变量到主内存
        进入 sychroznied d代码块前 清空线程的工作内存， 从主内存中获取最新的值
        注：这里使用的必须是同一把锁


    指令重排序：
        1：编译器重排序（编译器优化）
        2: z指令并行重排序(处理器优化)
        3：内存系统重排序(处理器优化)
    as-if-serial语义（指无论 怎么重排序执行结果都会相同---在单线程不会有任何问题） 》》 在多线程的环境下会造成不同的结果


 */